/*
 * @Descripttion: 取消重复请求
 * @version:
 * @Author: lhl
 * @Date: 2024-11-17 01:59:46
 * @LastEditors: lhl
 * @LastEditTime: 2024-11-17 02:13:46
 */
import type { AxiosRequestConfig } from 'axios';

/**
 * 请求取消控制器
 */
export class RequestCancel {
  // 存储待处理的请求
  private pendingMap: Map<string, AbortController> = new Map();

  /**
   * 生成请求标识
   * @param config 请求配置
   * @returns 请求标识
   */
  generateKey(config: AxiosRequestConfig): string {
    return [config.method, config.url, JSON.stringify(config.params), JSON.stringify(config.data)].join('&');
  }

  /**
   * 添加待处理请求
   * @param config 请求配置
   */
  addPending(config: AxiosRequestConfig): void {
    const key = this.generateKey(config);
    // 如果存在相同请求，则取消之前的请求
    if (this.pendingMap.has(key)) {
      this.removePending(config);
    }
    const controller = new AbortController();
    config.signal = controller.signal;
    this.pendingMap.set(key, controller);
  }

  /**
   * 移除待处理请求
   * @param config 请求配置
   */
  removePending(config: AxiosRequestConfig): void {
    const key = this.generateKey(config);
    if (this.pendingMap.has(key)) {
      const controller = this.pendingMap.get(key)!;
      controller.abort();
      this.pendingMap.delete(key);
    }
  }

  /**
   * 清空所有待处理请求
   */
  removeAllPending(): void {
    this.pendingMap.forEach((controller) => {
      controller.abort();
    });
    this.pendingMap.clear();
  }
}
